package org.cloudfoundry.runtime.service.relational;
import java.sql.DriverManager;
import javax.sql.DataSource;
import org.cloudfoundry.runtime.env.CloudEnvironment;
import org.cloudfoundry.runtime.env.CloudServiceException;
import org.cloudfoundry.runtime.env.MysqlServiceInfo;
import org.cloudfoundry.runtime.service.AbstractServiceCreator;
import org.springframework.jdbc.datasource.SimpleDriverDataSource;
/**
* Simplified access to Mysql service.
*
* @author Ramnivas Laddad
*
*/
public class MysqlServiceCreator
extends AbstractServiceCreator<DataSource, MysqlServiceInfo> {
private static String DRIVER_CLASS_NAME = "com.mysql.jdbc.Driver";
public MysqlServiceCreator(CloudEnvironment cloudEnvironment) {
super(cloudEnvironment, MysqlServiceInfo.class);
}
/**
* Create a datasource based on service info.
*
* <p>
* Tries to create a pooled connection based on either
*/
public DataSource createService(MysqlServiceInfo serviceInfo) {
try {
Class.forName(DRIVER_CLASS_NAME);
// Give first preference to user's DBCP datasource
if (hasClass("org.apache.commons.dbcp.BasicDataSource")) {
org.apache.commons.dbcp.BasicDataSource ds = new org.apache.commons.dbcp.BasicDataSource();
ds.setDriverClassName(DRIVER_CLASS_NAME);
ds.setUrl(serviceInfo.getUrl());
ds.setUsername(serviceInfo.getUserName());
ds.setPassword(serviceInfo.getPassword());
return ds;
// else, we have one from Tomcat
} else if (hasClass("org.apache.tomcat.dbcp.dbcp.BasicDataSource")) {
org.apache.tomcat.dbcp.dbcp.BasicDataSource ds = new org.apache.tomcat.dbcp.dbcp.BasicDataSource();
ds.setDriverClassName(DRIVER_CLASS_NAME);
ds.setUrl(serviceInfo.getUrl());
ds.setUsername(serviceInfo.getUserName());
ds.setPassword(serviceInfo.getPassword());
return ds;
} else {
// Only for testing outside Tomcat/CloudFoundry
return new SimpleDriverDataSource(DriverManager.getDriver(serviceInfo.getUrl()),
serviceInfo.getUrl(),
serviceInfo.getUserName(),
serviceInfo.getPassword());
}
} catch (Exception e) {
throw new CloudServiceException("Failed to created cloud datasource for " + serviceInfo.getServiceName() + " service", e);
}
}
private boolean hasClass(String name) {
try {
Class.forName(name);
return true;
} catch (Throwable ex) {
return false;
}
}
}